package cn.ibobo.lease.common.util;

import com.github.pagehelper.PageInfo;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * Description: 分页视图对象工具类
 * ClassName: PaginationVOUtil
 * @author bushy
 * @version 1.0 2017年10月19日下午5:30:34
 */
@Component
public class PaginationVOUtil {

	public static <E> PaginationVO<E> getPaginationVO(List<E> list) {
		PaginationVO<E> pageListVO = new PaginationVO<E>();
		if(list == null || list.size() ==0){ //参数为null时，返回空信息
			pageListVO.setPageNum(1);
			return pageListVO;
		}
		BeanUtils.copyProperties(new PageInfo<>(list), pageListVO);
		pageListVO.setData(list);
		return pageListVO;
	}
	
	/**
	 * 分页 返回vo实体
	 * @author 郭鑫
	 * @createDate 2018年2月28日上午11:24:10
	 * @param list
	 * @param clazz
	 * @return
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 */
	public static <E,T> PaginationVO<T> getPaginationVO(List<E> list, Class<T> clazz) throws InstantiationException, IllegalAccessException {
		PaginationVO<T> pageListVO = new PaginationVO<T>();
		List<T> result = new ArrayList<T>();
		for(E entitys : list) {
			T vo =  clazz.newInstance();
			BeanUtils.copyProperties(entitys, vo);
			result.add(vo);
		}
		BeanUtils.copyProperties(new PageInfo<>(list), pageListVO);
		pageListVO.setData(result);
		if(pageListVO.getPageNum() == 0){
			pageListVO.setPageNum(1);
		}
		return pageListVO;
	}
	
	public static <E,T> PaginationVO<T> getPaginationVO(List<E> list, Class<T> clazz, Integer pageNum) throws InstantiationException, IllegalAccessException {
		PaginationVO<T> pageListVO = new PaginationVO<T>();
		List<T> result = new ArrayList<T>();
		for(E entitys : list) {
			T vo =  clazz.newInstance();
			BeanUtils.copyProperties(entitys, vo);
			result.add(vo);
		}
		BeanUtils.copyProperties(new PageInfo<>(list), pageListVO);
		if (pageNum > pageListVO.getPages()) {
			pageListVO.setData(new ArrayList<T>());
		} else {
			pageListVO.setData(result);
		}
		if(pageListVO.getPageNum() == 0){
			pageListVO.setPageNum(1);
		}
		return pageListVO;
	}
	
	/**
	 * 一对多关联查询数据结果分页
	 * @author qzheng
	 * @createDate 2017年12月12日上午10:17:52
	 * @param list
	 * @param pageNum
	 * @param pageSize
	 * @return
	 */
	public static <E> PaginationVO<E> getPaginationVO(List<E> list, Integer pageNum, Integer pageSize) {
		
		PaginationVO<E> pageListVO = new PaginationVO<E>();
		
		List<E> reList = null;
		if (list != null && list.size() > 0) {
			//数据处理
			reList = new ArrayList<E>();
			if (list.size() <= pageNum * pageSize) {
				for (int i = pageSize * (pageNum - 1); i < list.size(); i++) {
					reList.add(list.get(i));
				}
			} else {
				for (int i = pageSize * (pageNum - 1); i < pageNum * pageSize; i++) {
					reList.add(list.get(i));
				}
			}
			
			//分页控制
			pageListVO.setTotal(list.size());
			pageListVO.setPrePage(pageNum - 1);
			pageListVO.setPages(list.size() % pageSize > 0 ? list.size() / pageSize + 1 : list.size() / pageSize);
			pageListVO.setPageSize(pageSize);
			pageListVO.setPageNum(pageNum);
			pageListVO.setNextPage(list.size() <= pageSize * pageNum ? 0 : pageNum + 1);
		}
		pageListVO.setData(reList);
		if(pageListVO.getPageNum() == 0){
			pageListVO.setPageNum(1);
		}
		
		return pageListVO;
	}
	
	@SuppressWarnings("unchecked")
	public static <E, T> PaginationVO<T> copyList2PaginationVO(List<E> original, T target) {
		List<T> tarList = new ArrayList<T>();
		for (E e : original) {
			T tar;
			try {
				tar = (T)target.getClass().newInstance();
				BeanUtils.copyProperties(e, tar);
				tarList.add(tar);
			} catch (InstantiationException | IllegalAccessException exp) {
				exp.printStackTrace();
			}
		}
		PaginationVO<T> pageListVO = new PaginationVO<T>();
		BeanUtils.copyProperties(new PageInfo<>(original), pageListVO);
		pageListVO.setData(tarList);
		if(pageListVO.getPageNum() == 0){
			pageListVO.setPageNum(1);
		}
		return pageListVO;
	}

}
